package com.imooc.service.impl;

import com.imooc.dataobject.ProductInfo;
import com.imooc.dto.CartDto;
import com.imooc.enums.ProductStatusEnum;
import com.imooc.enums.ResultEnum;
import com.imooc.exception.SellException;
import com.imooc.repository.ProductInfoRepository;
import com.imooc.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 功能描述: <br>
 * (商品模块service)
 *
 * @Author:Mr. xyb
 * @Date: 2018/5/18 17:21
 * @since: 1.8.0
 * @version: 1.0.0
 */
@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductInfoRepository repository;

    /**
     * 查询单个商品信息
     *
     * @param productId
     * @return
     */
    @Override
    public ProductInfo findOne(String productId) {
        return repository.findOne(productId);
    }

    /**
     * 查询全部上架商品信息
     *
     * @return
     */
    @Override
    public List<ProductInfo> findUpAll() {
        return repository.findByProductStatus(ProductStatusEnum.UP.getCode());
    }

    /**
     * 分页查询所有商品信息
     *
     * @param pageable 分页参数
     * @return
     */
    @Override
    public Page<ProductInfo> findAll(Pageable pageable) {
        return repository.findAll(pageable);
    }


    /**
     * 保存商品信息
     *
     * @param info
     * @return
     */
    @Override
    public ProductInfo save(ProductInfo info) {
        return repository.save(info);
    }

    /**
     * 加库存，一般来说是有人取消订单或者退款执行
     *
     * @param cartDtos 购物车信息（其实就是订单中的商品信息的集合）
     */
    @Override
    @Transactional
    public void increaseStock(List<CartDto> cartDtos) {
        for (CartDto cartDto : cartDtos) { // 遍历购物车
            ProductInfo info = repository.findOne(cartDto.getProductId());// 根据购物车中的商品id查询商品信息
            if (info == null) { // 如果当前商品不存在则抛出异常
                throw new SellException(ResultEnum.PRODUCT_NOT_EXIST);
            }
            // 如果商品存在则将购物车中的商品数量加到商品信息中的数量中
            Integer result = info.getProductStock() + cartDto.getProductQuantity();
            info.setProductStock(result);
            repository.save(info);// 保存对象
        }
    }

    /**
     * 扣库存
     * 创建订单时扣库存
     *
     * @param cartDtos
     */
    @Override
    @Transactional
    public void decreaseStock(List<CartDto> cartDtos) {
        for (CartDto cartDto : cartDtos) {// 遍历购物车集合
            ProductInfo info = repository.findOne(cartDto.getProductId());// 根据购物车商品id查询数据
            if (info == null) {// 不存在则抛出异常
                throw new SellException(ResultEnum.PRODUCT_NOT_EXIST);
            }
            // 从商品信息对象中的库存中减去购物车中需要购买的数量
            Integer result = info.getProductStock() - cartDto.getProductQuantity();
            if (result < 0) {// 如果商品中的数量少于购物车中想要购买的数量则抛出异常
                throw new SellException(ResultEnum.PRODUCT_STOCK_ERROR);
            }
            info.setProductStock(result);// 设置剩余库存
            repository.save(info);// 保存商品信息
        }
    }

    /**
     * 商品上架
     *
     * @param productId
     * @return
     */
    @Override
    public ProductInfo onSale(String productId) {
        // 查询商品信息
        ProductInfo info = repository.findOne(productId);
        if (info == null) {// 为空抛出异常
            throw new SellException(ResultEnum.PRODUCT_NOT_EXIST);
        }
        // 如果商品已经为上架状态，则抛出异常
        if (info.getProductStatusEnum() == ProductStatusEnum.UP) {
            throw new SellException(ResultEnum.PRODUCT_STATUS_ERROR);
        }
        // 设置上架状态
        info.setProductStatus(ProductStatusEnum.UP.getCode());
        // 保存商品信息，返回保存后的商品信息
        ProductInfo productInfo = repository.save(info);
        return productInfo;
    }

    /**
     * 下架
     *
     * @param productId
     * @return
     */
    @Override
    public ProductInfo offSale(String productId) {
        // 查询商品信息
        ProductInfo info = repository.findOne(productId);
        if (info == null) {
            throw new SellException(ResultEnum.PRODUCT_NOT_EXIST);
        }
        // 如果商品状态本就为下架则抛出异常
        if (info.getProductStatusEnum() == ProductStatusEnum.DOWN) {
            throw new SellException(ResultEnum.PRODUCT_STATUS_ERROR);
        }
        // 设置商品状态为下架
        info.setProductStatus(ProductStatusEnum.DOWN.getCode());
        // 保存商品信息，返回保存后的商品信息
        ProductInfo productInfo = repository.save(info);
        return productInfo;
    }
}
